package com.kmxd.ams.client.arrange;

import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kmxd.ams.client.archive.dto.BoxGroupFieldQueryDTO;
import com.kmxd.ams.client.archive.dto.RuleFieldQueryDTO;
import com.kmxd.ams.client.archive.vo.ArchiveRuleFieldListVO;
import com.kmxd.ams.client.arrange.dto.*;
import com.kmxd.ams.client.arrange.vo.*;
import com.kmxd.ams.client.oss.vo.EfileRecordListVO;
import com.kmxd.ams.infra.arrange.base.BaseBO;
import com.kmxd.ams.infra.arrange.base.SystemBO;
import com.kmxd.ams.infra.arrange.entity.Box;
import com.kmxd.ams.infra.arrange.entity.Catalog;
import com.kmxd.ams.infra.arrange.entity.Document;
import com.kmxd.ams.infra.arrange.entity.Volume;
import java.util.List;
import java.util.Map;

/**
 * 档案整理通用接口 服务类
 *
 * @author ZuoLG
 * @since 2022-07-20
 */
public interface IArrangeCommonSvc {

  /**
   * 根据档案库及类型获取表头
   *
   * @param req
   * @return
   */
  List<ClumnsListVO> getClumns(BaseQueryDTO req);

  /**
   * 获取文件 盒级列信息
   *
   * @param req
   * @return
   */
  ClumnsBoxListVO getClumnsByBox(BaseQueryDTO req);

  /**
   * 获取案卷 文件列信息
   *
   * @param req
   * @return
   */
  ClumnsVolumeListVO getClumnsByVolume(BaseQueryDTO req);

  /**
   * 根据档案库及类型获取表头
   *
   * @param req
   * @return
   */
  List<ClumnsListVO> getClumnsV2(BaseQueryDTO req);

  /**
   * 获取文件 盒级列信息
   *
   * @param req
   * @return
   */
  ClumnsBoxListVO getClumnsByBoxV2(BaseQueryDTO req);

  /**
   * 获取案卷 文件列信息
   *
   * @param req
   * @return
   */
  ClumnsVolumeListVO getClumnsByVolumeV2(BaseQueryDTO req);

  /**
   * 获取个性化查询设置
   *
   * @param req
   * @return
   */
  List<ClumnsQueryVO> getClumnsByQuery(BaseQueryDTO req);

  /**
   * 查询著录界面对象
   *
   * @param req
   * @return
   */
  FormVO getFormSchema(BaseQueryDTO req);

  /**
   * 调整分组字段信息
   *
   * @param req
   * @return
   */
  List<FormSchemaVO> getGroupFormSchema(BaseQueryDTO req);

  /**
   * 获取表单字段
   *
   * @param req
   * @return
   */
  List<FormFieldVO> getFormField(BaseQueryDTO req);

  /**
   * 装盒前校验
   *
   * @param req
   * @return
   */
  boolean verify(VerifyDTO req);

  /**
   * 重复校验
   *
   * @param req
   * @return
   */
  CheckRepeatVO checkRepeat(Document req, Map<String, String> map);

  /**
   * 加载盒信息
   *
   * @param req
   * @return
   */
  LoadBoxVO loadBox(LoadBoxDTO req);

  /**
   * 加载盒列表
   *
   * @param reqPage
   * @param req
   * @return
   */
  Page<Box> loadBoxList(Page reqPage, LoadBoxDTO req);
  /**
   * 装盒
   *
   * @param req
   * @return
   */
  List<InBoxVO> inBox(InBoxDTO req);

  /**
   * 获取档号
   *
   * @param req
   * @return
   */
  ArchCodeVO archCode(Document req);

  /**
   * 获取档号 VolumeArchCodeDTO
   *
   * @param req
   * @return
   */
  ArchCodeVO archCode(Volume req);

  /**
   * 刷新档号
   *
   * @param req
   * @return
   */
  boolean refreshArchCode(RefreshArchCodeDTO req);

  /**
   * 归档
   *
   * @param req
   * @return
   */
  boolean archiving(ArchivingDTO req);

  /**
   * 重新整理
   *
   * @param req
   * @return
   */
  boolean againCollect(AgainCollectDTO req);

  /**
   * 调整盒信息
   *
   * @param req
   * @return
   */
  boolean adjustGroup(AdjustGroupDTO req);

  /**
   * 修改字段
   *
   * @param req
   * @return
   */
  boolean updateField(UpdateFieldDTO req);

  /**
   * 组卷
   *
   * @param req
   * @return
   */
  List<InVolumeVO> inVolume(VolumeBuildUpDTO req);

  /**
   * @param req
   * @return
   */
  List<ArchiveRuleFieldListVO> boxGroupFieldList(BoxGroupFieldQueryDTO req);

  List<ArchiveRuleFieldListVO> getRuleFieldByVersion(RuleFieldQueryDTO req);

  /**
   * 打散盒或卷
   *
   * @param req
   */
  void breakUp(BreakUpDTO req);

  /**
   * 合并组件
   *
   * @param req
   */
  void mergeDocument(MergeDocumentDTO req);

  /**
   * 获取合并组件列表
   *
   * @param req
   * @return
   */
  List<EfileRecordListVO> getMergeFileList(MergeEFileQueryDTO req);

  /**
   * 同分类调件
   *
   * @param req
   */
  void changeSort(BaseBO req);

  DocumentChangeSortListVO changeSortList(Document req);

  VolumeChangeSortListVO changeSortList(Volume req);

  void associatedWithData(AssociatedWithDataDTO req);

  void associatedWithMeta(AssociatedWithMetaDTO req);

  /**
   * 查询档案库树
   *
   * @param req
   * @return
   */
  List<Tree<String>> selectArchTree(QueryArchTypeDTO req);

  /**
   * 获取档案库列表
   *
   * @param req
   * @return
   */
  List<ArrangeArchTypeListVO> archTypeList(ArrangeArchTypeQueryDTO req);

  /**
   * 获取继承数据信息
   *
   * @param req
   * @param <T>
   * @return
   */
  <T> T getExtendData(SystemBO req);

  void refreshCatalog(Catalog req);

  Integer getMaxVolumeSequence(Map<String, Object> condition, String tableId);

  Integer getMaxDocumentSequence(Map<String, Object> condition, String tableId);

  void createEsIndex(CreateEsIndexDTO req);
}
